class EventEmiter {
  constructor() {
    // 事件对象，存放订阅的名字和事件
    this._events = {};
  }
  // 订阅事件的方法
  on(eventName, callback) {
    if (!this._events) {
      this._events = {};
    }
    // 合并之前订阅的cb
    this._events[eventName] = [...(this._events[eventName] || []), callback];
    console.log(this._events, "this._events123");
  }
  // 触发事件的方法
  emit(eventName, ...args) {
    if (!this._events[eventName]) {
      return;
    }
    
    // 遍历执行所有订阅的事件
    this._events[eventName].forEach((fn) => fn(...args));
  }
  off(eventName, cb) {
    if (!this._events[eventName]) {
      return;
    }
    // 删除订阅的事件
    this._events[eventName] = this._events[eventName].filter(
      (fn) => {
        console.log(fn != cb);
        console.log(fn[1] != cb);
        return fn != cb && fn[1] != cb
      }
    );
    console.log(this._events, "this._events123");
  }
  // 绑定一次 触发后将绑定的移除掉 再次触发掉
  once(eventName, callback) {
    const one = (...args) => {
      // 等callback执行完毕在删除
      callback(args);
      this.off(eventName, one);
    };
    one.l = callback; // 自定义属性
    this.on(eventName, one);
  }
}

let event1 = new EventEmiter();

let login1 = function (...args) {
  console.log("login success1", args);
};
let login2 = function (...args) {
  console.log("login success2", args);
};

event1.on("login", login1);
event1.once("login", login2);
// event1.off("login", login2); // 解除订阅
